#ifndef PERIPHERAL_COM_H__
#define PERIPHERAL_COM_H__

#include <inttypes.h>

/// \defgroup CommAPI API Comm
/// 标准的串口通讯接口。
/// \n 调用流程图:
/// \code
///    =========================================
///                   |
///                 Create
///       +-----------|
///       |        SetAttribute
///       | +---------|
///       | |    CommRead
///       | |    CommWrite
///       | |    CommPurge
///       | +---------|
///       |      CommClose
///       +-----------|
///                Delete
///                   |
///    =========================================
/// \endcode
/// @{

namespace El {
namespace Peripheral {

#define UART_PURGE_TXABORT 0x0001 ///< 中止写操作
#define UART_PURGE_RXABORT 0x0002 ///< 中止读操作
#define UART_PURGE_TXCLEAR 0x0004 ///< 清空输出缓冲
#define UART_PURGE_RXCLEAR 0x0008 ///< 清空输入缓冲
/// 串口属性结构
typedef struct tagUartAttr {
    uint32_t baudrate; ///< 实际的波特率值。
    uint8_t databits;  ///< 实际的数据位数。
    uint8_t parity;    ///< 奇偶校验选项，取comm_parity_t类型的枚举值。
    uint8_t stopbits;  ///< 停止位数，取comm_stopbits_t类型的枚举值。
    uint8_t reserved;  ///< 保留
} UART_ATTR;

/// 串口停止位类型
enum UartStopbitsT {
    UART_ONESTOPBIT,   ///< 1 stop bit
    UART_ONE5STOPBITS, ///< 1.5 stop bit
    UART_TWOSTOPBITS   ///< 2 stop bit
};

/// 串口校验位类型
enum UartParityT {
    UART_NOPARITY,   ///< No parity
    UART_ODDPARITY,  ///< Odd parity
    UART_EVENPARITY, ///< Even parity
    UART_MARK,       ///<
    UART_SPACE       ///<
};

class Com {
public:
    Com(void);

    virtual ~Com(void);
    /// 创建串口设备
    ///
    /// \param [in] dev, 文件设备
    /// \param [in] block, 是否阻塞
    /// \retval <0 创建失败
    /// \retval 0 创建成功

    int32_t Create(const char *dev, bool block = true);
    /// 销毁串口设备
    ///
    /// \param 无
    /// \retval <0 销毁失败
    /// \retval 0 销毁成功
    int32_t Delete(void);

    /// 读串口数据，一直等到读出指定的字节或出错时才返回，否则阻塞。
    ///
    /// \param [out] pData 数据缓冲的指针。
    /// \param [in] nBytes 要读出的字节数
    /// \retval >0  读出的字节数
    /// \retval <=0 读失败
    int32_t Read(uint8_t *pData, uint32_t bytes);

    int32_t ReadLen(uint8_t *pData, uint32_t bytes);

    /// 写串口数据，一直等到写入指定的字节或出错时才返回，否则阻塞。
    ///
    /// \param [in] pData 数据缓冲的指针。
    /// \param [in] nBytes 要写入的字节数
    /// \retval >0  写入的字节数
    /// \retval <=0 写失败
    int32_t Write(uint8_t *pData, uint32_t len);

    int32_t WriteLen(uint8_t *pData, uint32_t len);
    /// 中止串口读写操作或清空输入输出缓冲。
    ///
    /// \param [in] flags 要执行的操作,可以是下表中一个或多个值。
    /// \retval 0  操作成功
    /// \retval <0  操作失败
    int32_t Purge(uint32_t flags);

    /// 设置串口属性。
    ///
    /// \param [in] pAttr 指向串口属性结构UART_ATTR的指针。
    /// \retval 0  关闭成功
    /// \retval <0  关闭失败
    int32_t SetAttribute(UART_ATTR *pAttr);
    int32_t GetAttribute(void);

private:
    int32_t devFd_;
};

} // namespace Peripheral
} // namespace El

#endif // PERIPHERAL_COM_H__
